package org.totoro.memory.oom;

/**
 * 这个错误存在于小于等于 jdk 1.7 版本
 * 该错误表示永久代（Permanent Generation）已用满，通常是因为加载的 class 数目太多或体积太大。
 * <p>
 * 原因分析
 * 永久代存储对象主要包括以下几类：
 * <p>
 * 1、加载/缓存到内存中的 class 定义，包括类的名称，字段，方法和字节码；
 * 2、常量池；
 * 3、对象数组/类型数组所关联的 class；
 * 4、JIT 编译器优化后的 class 信息。
 * PermGen 的使用量与加载到内存的 class 的数量/大小正相关。
 * <p>
 * 解决方案
 * 根据 Permgen space 报错的时机，可以采用不同的解决方案，如下所示：
 * <p>
 * 1、程序启动报错，修改 -XX:MaxPermSize 启动参数，调大永久代空间
 * 2、应用重新部署时报错，很可能是没有应用没有重启，导致加载了多份 class 信息，只需重启 JVM 即可解决。
 * 3、运行时报错，应用程序可能会动态创建大量 class，而这些 class 的生命周期很短暂，但是 JVM 默认不会卸载 class，可以设置 -XX:+CMSClassUnloadingEnabled 和 -XX:+UseConcMarkSweepGC这两个参数允许 JVM 卸载 class
 * 如果上述方法无法解决，可以通过 jmap 命令 dump 内存对象 jmap-dump:format=b,file=dump.hprof<process-id> ，然后利用 Eclipse MAT https://www.eclipse.org/mat 功能逐一分析开销最大的 classloader 和重复 class。
 *
 * @author daocr
 * @date 2020/3/2
 */
public class PermgenSpaceOom {
}
